package pkg

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"strings"
)

// AMapGeoCodeResult 解析高德地理编码 API 返回的结果
type AMapGeoCodeResult struct {
	Status   string `json:"status"` // API 返回状态，"1" 表示成功
	Count    string `json:"count"`  // 结果数量
	Geocodes []struct {
		Location string `json:"location"` // 经纬度，格式 "经度,纬度"
	} `json:"geocodes"`
}

// addressToCoords 地址转经纬度核心函数
// 参数：address（要解析的地址）、amapKey（高德 Web 服务 Key）
// 返回：longitude（经度）、latitude（纬度）、error（错误信息）
func AddressToCoords(address, amapKey string) (longitude, latitude string, err error) {
	// 高德地理编码 API 地址
	apiURL := "https://restapi.amap.com/v3/geocode/geo"

	// 构建请求参数
	params := url.Values{
		"address": {address},
		"key":     {amapKey},
		"city":    {""}, // 选填参数，可指定城市提高解析精度
	}

	// 发送 HTTP GET 请求
	resp, err := http.Get(fmt.Sprintf("%s?%s", apiURL, params.Encode()))
	if err != nil {
		return "", "", fmt.Errorf("请求高德 API 失败: %v", err)
	}
	defer resp.Body.Close()

	// 读取响应内容
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return "", "", fmt.Errorf("读取响应失败: %v", err)
	}

	// 解析 JSON 响应
	var result AMapGeoCodeResult
	if err = json.Unmarshal(body, &result); err != nil {
		return "", "", fmt.Errorf("解析 JSON 失败: %v", err)
	}

	// 校验 API 返回状态
	if result.Status != "1" {
		return "", "", fmt.Errorf("API 返回失败，状态码: %s，响应内容: %s", result.Status, string(body))
	}
	if result.Count == "0" {
		return "", "", fmt.Errorf("地址解析无结果，请检查地址: %s", address)
	}

	// 提取经纬度（修复原代码的分割逻辑）
	location := result.Geocodes[0].Location
	coords := strings.Split(location, ",")
	if len(coords) != 2 {
		return "", "", fmt.Errorf("经纬度格式错误，原始数据: %s", location)
	}

	return coords[0], coords[1], nil
}
